﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using ComparteTuTiempo.Models;
using ComparteTuTiempo.Models.CustomClass;
using ComparteTuTiempo.Models.CustomModels;
namespace ComparteTuTiempo.Controllers
{
    public class TrabajoController : Controller
    {
        //-------------Variables Globales-----------\\

        private ListarTrabajos lt = new ListarTrabajos();
        private compartetutiempoEntities db = new compartetutiempoEntities();
        ProfesionesDisponibles tra = new ProfesionesDisponibles();
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        [ChildActionOnly]
        public ActionResult tengoTrabajos()
        {
            try
            {
                ViewBag.trab = null;
                List<trabajossolicitados> trab = new List<trabajossolicitados>();
                int idUsuario = (int)Session["id"];
                trab = lt.trabSinLeer(idUsuario);
                if (trab.Count() > 0)
                {
                    ViewBag.trab = trab;
                }
                return PartialView("_TrabIcoPartial");
            }
            catch (Exception)
            {

              return RedirectToAction("Index", "Home");
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        [ChildActionOnly]
        public ActionResult tengomensajes()
        {
            ViewBag.msg = null;
            List<trabajosconversaciones> msg = new List<trabajosconversaciones>();
            int idUsuario = (int)Session["id"];
            List<int> idTrabajo = lt.MsgSinLeer(idUsuario);
            if (idTrabajo.Count() > 0)
            {
                ViewBag.msg = idTrabajo;
            }
            return PartialView("_MenIcoPartial");


        }
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public ActionResult ListarTrabajosMeSolicitan()
        {

            try
            {
                int idUsuario = (int)Session["id"];
                var trabajosMeSolicitan = lt.trabajoMeSolicitan(idUsuario);

                //Llamada a metodo que rellena las profesiones disponibles para el usuario.
                List<SelectListItem> pro = tra.profesionesDisponibles(idUsuario, "todos");

                ViewBag.pro = new SelectList(pro, "Value", "Text");
                //////////////////////////////////
                return View(trabajosMeSolicitan.ToList());
            }
            catch (Exception)
            {
                
                return RedirectToAction("Index", "Home");
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="filtro"></param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult ListarTrabajosMeSolicitan(string filtro)
        {

            try
            {
                List<trabajossolicitados> trabajosMeSolicitan = new List<trabajossolicitados>();
                int fil = int.Parse(filtro);
                int idUsuario = (int)Session["id"];
                if (fil == -1)
                {
                    trabajosMeSolicitan = lt.trabajoMeSolicitan(idUsuario);
                }
                else
                {
                    trabajosMeSolicitan = lt.trabajoMeSolicitan(idUsuario, fil);
                }
                //Llamada a metodo que rellena las profesiones disponibles para el usuario.

                List<SelectListItem> pro = tra.profesionesDisponibles(idUsuario, "todos");

                ViewBag.pro = new SelectList(pro, "Value", "Text");

                return View(trabajosMeSolicitan);
            }
            catch (Exception)
            {
                
               return RedirectToAction("Index", "Home");
            }



        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public ActionResult ListarTrabajosHeRealizado()
        {
            try
            {
                int idUsuario = (int)Session["id"];
                var trabajos = lt.listarTrabajosResolucion(idUsuario, true);
                List<SelectListItem> pro = tra.profesionesDisponibles(idUsuario, "todos");
                ViewBag.pro = new SelectList(pro, "Value", "Text");
                return View(trabajos.ToList());
            }
            catch (Exception)
            {
                
                return RedirectToAction("Index", "Home");
            }

        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="idTrabajo"></param>
        /// <param name="mensaje"></param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult ListarTrabajosHeRealizado(string filtro)
        {
            try
            {
                List<trabajossolicitados> trabajosHeRealizado = new List<trabajossolicitados>();
                int fil = int.Parse(filtro);
                int idUsuario = (int)Session["id"];
                if (fil == -1)
                {
                    trabajosHeRealizado = lt.listarTrabajosResolucion(idUsuario, true);
                }
                else
                {
                    trabajosHeRealizado = lt.listarTrabajosResolucion(idUsuario, true, fil);
                }
                List<SelectListItem> pro = tra.profesionesDisponibles(idUsuario, "todos");
                ViewBag.pro = new SelectList(pro, "Value", "Text");
                return View(trabajosHeRealizado);
            }
            catch (Exception)
            {
                
                return RedirectToAction("Index", "Home");
            }
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="idTrabajo"></param>
        /// <param name="mensaje"></param>
        /// <returns></returns>
        public ActionResult DetalleTrabajo(int idTrabajo = 0, string mensaje = "")
        {
            
                CustomTrabajoMensaje customtrabajo = new CustomTrabajoMensaje();
                if (Request.IsAjaxRequest() == false)
                {
                    ViewBag.idUsuario = Session["id"];
                    lt.msgVisitado(idTrabajo, (int)Session["id"]);
                    Session["idTrabajo"] = idTrabajo;

                    customtrabajo.trabajossolicitados = db.trabajossolicitados.Find(idTrabajo);

                    if (customtrabajo.trabajossolicitados == null)
                    {
                        return HttpNotFound();
                    }
                    return View(customtrabajo);
                }
                else
                {
                    int idTrabajoAjax = (int)Session["idTrabajo"];
                    customtrabajo.trabajossolicitados = db.trabajossolicitados.Find(idTrabajoAjax);
                    return PartialView("_MensajesPartial", customtrabajo);
                }
            
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="customtrabajo"></param>
        /// <param name="texto"></param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult DetalleTrabajo(CustomTrabajoMensaje customtrabajo, string texto)
        {
            try
            {
                customtrabajo.trabajossolicitados = db.trabajossolicitados.Find(Session["idtrabajo"]);
                trabajosconversaciones conversacion = new trabajosconversaciones();
                lt.msgVisitado((int)Session["idtrabajo"], (int)Session["id"]);
                if (texto != "")
                {
                    conversacion.idAutor = (int)Session["id"];
                    conversacion.idTrabajo = (int)Session["idtrabajo"];
                    conversacion.texto = texto;
                    conversacion.fechaHora = DateTime.Now;
                    customtrabajo.trabajossolicitados.trabajosconversaciones.Add(conversacion);
                    db.SaveChanges();
                    ModelState.Clear();
                }
                return PartialView("_MensajesPartial", customtrabajo);
            }
            catch (Exception)
            {
                
                return RedirectToAction("Index", "Home");
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public ActionResult DetalleTrabajoRealizado(int idTrabajo)
        {
            try
            {
                int idUsuario=(int)Session["id"];
                ViewBag.idUsuario = idUsuario;
                Session["idTrabajo"] = idTrabajo;
                trabajossolicitados tra = lt.trabResueltoById(idTrabajo);
                return View(tra);
            }
            catch (Exception)
            {
                
                return RedirectToAction("Index", "Home");
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>

        [HttpPost]
        public ActionResult DetalleTrabajoRealizado(trabajossolicitados tra)
        {
            try
            {
                int idTrabajo = (int)Session["idTrabajo"];
                trabajossolicitados trabajo = db.trabajossolicitados.Find(idTrabajo);
                trabajo.comentarioTrabajador = tra.comentarioTrabajador;
                db.SaveChanges();
                return View(trabajo);
            }
            catch (Exception)
            {
                
                return RedirectToAction("Index", "Home");
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="idTrabajo"></param>
        /// <returns></returns>
        public ActionResult FinalizarTrabajo(int idTrabajo)
        {
            try
            {
                Session["idTrabajo"] = idTrabajo;
                //Metodo para listar el trabajo por ID ** Pasar a un metodo
                trabajossolicitados trabajo = lt.listarTrabajoID(idTrabajo);

                return View(trabajo);
            }
            catch (Exception)
            {
                
                return RedirectToAction("Index", "Home");
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="comentario"></param>
        /// <param name="horas"></param>
        /// <param name="minutos"></param>
        /// <param name="puntuacion"></param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult FinalizarTrabajo(string comentario, int horas, int minutos, int puntuacion)
        {
            try
            {
                int idTrabajo = (int)Session["idTrabajo"];
                trabajossolicitados trabajo = db.trabajossolicitados
                    .Where(trabajossolicitados => trabajossolicitados.idTrabajosSolicitados == idTrabajo)
                    .First();
                TimeSpan h = new TimeSpan(horas, minutos, 0);
                trabajo.usuarios.horasDisponibles = trabajo.usuarios.horasDisponibles - h;
                trabajo.usuarios1.horasDisponibles = trabajo.usuarios1.horasDisponibles + h;
                trabajo.comentarioSolicitante = comentario;
                trabajo.puntuacion = puntuacion;
                trabajo.horaTrabajadas = h;
                trabajo.fechaRealizado = DateTime.Now;
                trabajo.realizado = true;
                if (ModelState.IsValid)
                {
                    db.SaveChanges();
                }
                return RedirectToAction("ListarTrabajosSolicitado");
            }
            catch (Exception)
            {
                
                return RedirectToAction("Index", "Home");
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public ActionResult ListarTrabajosPendientes()
        {


            try
            {
                int id = (int)Session["id"];

                // Consulta de trabajos solicitados que no esten resueltos
                //List<trabajossolicitados> trabajos = db.trabajossolicitados
                //    .Where(trabajossolicitados => trabajossolicitados.idtrabajador == id
                //    && trabajossolicitados.realizado == false).ToList();

                List<trabajossolicitados> trabajos = lt.listarTrabajosResolucion(id, false);

                return View(trabajos);
            }
            catch (Exception)
            {
                
                return RedirectToAction("Index", "Home");
            }
        }


        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public ActionResult ListarTrabajosSolicitado()
        {
            try
            {
                int id = (int)Session["id"];
                List<trabajossolicitados> trabajos = lt.listarTrabajosResolucionCliente(id, false);
                return View(trabajos);
            }
            catch (Exception)
            {
                
                return RedirectToAction("Index", "Home");
            }
        }
        //////////////////////////////////
        /// <summary>
        /// 
        /// </summary>
        /// <param name="filtro"></param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult ListarTrabajosSolicitado(int filtro)
        {
            try
            {
                int id = (int)Session["id"];
                List<trabajossolicitados> trabajos = new List<trabajossolicitados>();
                //Insertar Case para las opciones de filtrado
                //1:Todos,2:Aceptados,3:Rechazados,4:Pendientes
                switch (filtro)
                {
                    case 1:
                        trabajos = lt.ListarTrabajosSolicitado(id);
                        break;
                    case 2:
                        trabajos = lt.ListarTrabajosSolicitado(id, true);
                        break;
                    case 3:
                        trabajos = lt.ListarTrabajosSolicitado(id, false);
                        break;
                    case 4:
                        trabajos = lt.ListarTrabajosSolicitado(id, "nulo");
                        break;

                    default:
                        break;
                }
                return View(trabajos);
            }
            catch (Exception)
            {
                
                return RedirectToAction("Index", "Home");
            }
        }

        /////////////////////////////
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public ActionResult ListarTrabajosRealizados()
        {
            try
            {
                int id = (int)Session["id"];

                // Consulta que rellena una lista de trabajos que han sido marcados como realizados 
                //**Pasar a un metodo aparte (Posibilidad de que el metodo reciba un parametro de filtrado por repetirse varias veces)
                List<trabajossolicitados> trabajos = lt.listarTrabajosResolucionCliente(id, true);

                return View(trabajos);
            }
            catch (Exception)
            {
                
                return RedirectToAction("Index", "Home");
            }
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="idTrabajo"></param>
        /// <returns></returns>
        public ActionResult AceptarTrabajo(int idTrabajo = 0)
        {
            try
            {
                lt.trbVisitado(idTrabajo);
                trabajossolicitados trabajossolicitados = db.trabajossolicitados.Find(idTrabajo);
                String profesion = trabajossolicitados.profesiones.nombre;
                ViewBag.profesion = profesion;
                String solicitante = trabajossolicitados.usuarios.nombre;
                ViewBag.solicitante = solicitante;
                String descripcion = trabajossolicitados.descripcion;
                ViewBag.descripcion = descripcion;

                Session["idTrabajo"] = idTrabajo;
                return View(trabajossolicitados);
            }
            catch (Exception)
            {
                
               return RedirectToAction("Index", "Home");
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="opcion"></param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult AceptarTrabajo(String opcion)
        {
            try
            {
                trabajossolicitados trabajossolicitados = db.trabajossolicitados.Find(Session["idTrabajo"]);
                switch (opcion)
                {
                    case "aceptar":
                        trabajossolicitados.aceptado = true;

                        break;
                    case "rechazar":
                        trabajossolicitados.aceptado = false;
                        break;

                    default:
                        break;
                }

                db.SaveChanges();
                return RedirectToAction("ListarTrabajosPendientes");
            }
            catch (Exception)
            {
                
                return RedirectToAction("Index", "Home");
            }
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="usu"></param>
        /// <returns></returns>
        public ActionResult SolicitarTrabajo(int usu)
        {
            try
            {
                Session["usu"] = usu;

                // Consulta que rellena una variale con los trabajos disponibles para el usuario ** PASAR A UN METODO INDEPENDIENTE**
                var p = (db.profesionesusuarios.Where(profesionesusuarios => profesionesusuarios.idUsuarios == usu))
                    .Select(s => new { s.idProfesiones, s.profesiones.nombre });
                ViewBag.pro = new SelectList(p, "idProfesiones", "nombre");
                /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

                trabajossolicitados trab = new trabajossolicitados();

                var NombreSolic = (db.usuarios.Where(usuarios => usuarios.idUsuarios == usu)
                    .Select(s => s.nombre)).First();
                var ApellidoSoli = (db.usuarios.Where(usuarios => usuarios.idUsuarios == usu)
                    .Select(s => s.apellidos)).First();

                string nombre = NombreSolic + " " + ApellidoSoli;
                ViewBag.Nom = nombre.ToUpper();

                return View();
            }
            catch (Exception)
            {
                
                return RedirectToAction("Index", "Home");
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="trabajossolicitados"></param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult SolicitarTrabajo(trabajossolicitados trabajossolicitados)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    trabajossolicitados.idtrabajador = (int)(Session["usu"]);
                    trabajossolicitados.idSolicitante = (int)(Session["id"]);
                    trabajossolicitados.fechaOferta = DateTime.Now;
                    db.trabajossolicitados.Add(trabajossolicitados);
                    db.SaveChanges();
                    Session.Remove("usu");
                    return RedirectToAction("ListarTrabajosSolicitado");
                }

                ViewBag.idProfesion = new SelectList(db.profesiones, "idProfesiones", "nombre", trabajossolicitados.idProfesion);
                ViewBag.idSolicitante = new SelectList(db.usuarios, "idUsuarios", "nombre", trabajossolicitados.idSolicitante);
                ViewBag.idtrabajador = new SelectList(db.usuarios, "idUsuarios", "nombre", trabajossolicitados.idtrabajador);
                return View(trabajossolicitados);
            }
            catch (Exception)
            {
                
                return RedirectToAction("Index", "Home");
            }
        }

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
    }
}